home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 2002 #11
/
Amiga Plus CD - 2002 - No. 11.iso
/
Tools
/
Development
/
Feelin021015
/
Libs
/
Feelin
/
Shade.e
< prev
next >
Wrap
Text File
|
2002-10-28
|
22KB
|
779 lines
OPT PREPROCESS,OSVERSION=39
MODULE 'intuition/intuition','intuition/intuitionbase','intuition/screens','intuition/classes','intuition/imageclass','intuition/gadgetclass','intuition/classusr',
'graphics/rastport','graphics/text',
'utility','utility/tagitem','utility/hooks',
'feelin','libraries/feelin','a4'
LIBRARY 'Shade.wr',1,02,'Feelin: Shade window renderer 1.02 (02-02-01) by Olivier Laviale (lotan9@aol.com)' IS class_Info(A0)
->PROC OBJ
OBJECT classuserdata
imageclass:PTR TO iclass
ENDOBJECT
->ENDPROC
DEF cud:PTR TO classuserdata
PROC main() IS sys_SGlob()
OBJECT mydata OF feelinWindowRenderer
font:PTR TO textfont
pens:PTR TO LONG
prep:PTR TO CHAR
activepens:PTR TO LONG
inactivepens:PTR TO LONG
aprep:PTR TO CHAR
iprep:PTR TO CHAR
gadw:INT,gadh:INT
image_close,image_iconify,image_zoom,image_depth
button_close,button_iconify,button_zoom,button_depth,button_dragbar,button_size
textdisplay:PTR TO feelinObject
barrect:feelinRect
handler:feelinEventHandler
ENDOBJECT
OBJECT myimagedata
renderer:PTR TO mydata
type:INT
ENDOBJECT
ENUM FV_GadgetType_Close = 1,
FV_GadgetType_Iconify,
FV_GadgetType_Zoom,
FV_GadgetType_Depth
CONST TICKNESS = 5,
TITLEX1 = 10, TITLEY1 = 3,
TITLEX2 = 10, TITLEY2 = 3
CONST SIZE = TICKNESS * 4
CONST FM_Renderer_TitleBar = FCCM_BASE
#define _Box(x1,y1,x2,y2) priv_Box(rp,x1,y1,x2,y2)
->ENDPROC
PROC class_Info (feelin:PTR TO feelinbase)
feelinbase := feelin
utilitybase := feelin.utility
SetStdOut(feelin.console)
RETURN [FA_DataSize, SIZEOF mydata,
FA_Dispatcher, {class_Dispatcher},
FA_ClassInit, {class_Init},
FA_ClassExit, {class_Exit},
NIL]
ENDPROC
PROC class_Init (class=A2:PTR TO feelinClass)
DEF ic:PTR TO iclass
sys_RGlob()
IF cud := F_New(SIZEOF classuserdata)
IF ic := MakeClass(NIL,'imageclass',NIL,SIZEOF mygaddata,NIL)
ic.dispatcher.entry := {image_dispatcher}
cud.imageclass := ic
RETURN class.userdata := cud
ENDIF
cud := F_Dispose(cud)
ENDIF
ENDPROC
PROC class_Exit (class=A2:PTR TO feelinClass)
sys_RGlob()
IF cud := class.userdata
cud.imageclass := RemoveClass(cud.imageclass) BUT NIL
cud := F_Dispose(cud)
ENDIF
ENDPROC
PROC class_Dispatcher(obj=A0:PTR TO mydata,method=D0,args=A1:PTR TO LONG)
sys_RGlob()
SELECT method
CASE FM_New; RETURN wr_New(obj,args)
CASE FM_Dispose; wr_Dispose(obj)
CASE FM_Setup; RETURN wr_Setup(obj,args)
CASE FM_Cleanup; RETURN wr_Cleanup(obj)
CASE FM_Show; wr_Show(obj)
CASE FM_Hide; wr_Hide(obj)
CASE FM_HandleEvent;RETURN wr_HandleEvent(obj,args::FS_HandleEvent.msg)
CASE FM_Window_Layout; wr_Layout(obj)
CASE FM_Window_Draw; wr_Draw(obj)
CASE FM_Renderer_TitleBar; wr_DrawTitleBar(obj)
ENDSELECT
ENDPROC
->-- Methods --<-------------------------------------------------------------
PROC wr_New(obj:PTR TO mydata,tags)
obj.handler.object := obj
obj.handler.priority := 10
obj.handler.events := IDCMP_ACTIVEWINDOW OR IDCMP_INACTIVEWINDOW
obj.aprep := '`z`n`Sh`Ss`<7>'
obj.iprep := '`z`n`b`<0>'
IF obj.textdisplay := F_NewObjA(FC_TextDisplay,NIL) THEN RETURN obj
ENDPROC
PROC wr_Dispose(obj:PTR TO mydata)
obj.textdisplay := F_DisposeObj(obj.textdisplay)
obj.button_size := DisposeObject(obj.button_size) BUT NIL
obj.button_dragbar := DisposeObject(obj.button_dragbar) BUT NIL
obj.button_depth := DisposeObject(obj.button_depth) BUT NIL
obj.button_zoom := DisposeObject(obj.button_zoom) BUT NIL
obj.button_iconify := DisposeObject(obj.button_iconify) BUT NIL
obj.button_close := DisposeObject(obj.button_close) BUT NIL
obj.image_depth := DisposeObject(obj.image_depth) BUT NIL
obj.image_zoom := DisposeObject(obj.image_zoom) BUT NIL
obj.image_iconify := DisposeObject(obj.image_iconify) BUT NIL
obj.image_close := DisposeObject(obj.image_close) BUT NIL
obj.font := CloseFont(obj.font) BUT NIL
ENDPROC
PROC wr_Setup(obj:PTR TO mydata,s:PTR TO FS_Setup)
DEF win:PTR TO feelinWindow,handler,dc,
ic:PTR TO iclass,i:PTR TO image,o:PTR TO object,d:PTR TO myimagedata
IF (obj.render := s.render) = NIL THEN RETURN
IF (win := s.render.windowobject) = NIL THEN RETURN
obj.font := F_DoA(obj.render.clientobject,
FM_Client_OpenFont,[
obj,FP_Renderer_Font])
obj.gadw := obj.font.ysize + (obj.font.ysize / 3)
obj.gadh := obj.font.ysize
obj.borders.l := 2 + TICKNESS ; obj.borders.r := 2 + TICKNESS
obj.borders.b := 2 + TICKNESS ; obj.borders.t := 2 + Max(obj.font.ysize,obj.gadh) + TITLEY1 + TITLEY2
IF ic := cud.imageclass
->PROC Close
IF WFLG_CLOSEGADGET AND win.winflags
IF i := NewObjectA(ic,NIL,[IA_WIDTH,obj.gadw, IA_HEIGHT,obj.gadh, NIL])
obj.image_close := i
d := i + ic.instoffset
d.renderer := obj
d.type := FV_GadgetType_Close
IF o := NewObjectA(NIL,'buttongclass',[
GA_WIDTH,obj.gadw,
GA_HEIGHT,obj.gadh,
GA_RELVERIFY,TRUE,
GA_ENDGADGET,TRUE,
GA_SYSGTYPE,GTYP_CLOSE,
GA_TOPBORDER,TRUE,
GA_IMAGE, i, NIL])
obj.button_close := o
ELSE
RETURN
ENDIF
ELSE
RETURN
ENDIF
ENDIF
->ENDPROC
->PROC Depth
IF WFLG_DEPTHGADGET AND win.winflags
IF i := NewObjectA(ic,NIL,[IA_WIDTH,obj.gadw, IA_HEIGHT,obj.gadh, NIL])
obj.image_depth := i
d := i + ic.instoffset
d.renderer := obj
d.type := FV_GadgetType_Depth
IF o := NewObjectA(NIL,'buttongclass',[
GA_WIDTH,obj.gadw,
GA_HEIGHT,obj.gadh,
GA_RELVERIFY,TRUE,
GA_SYSGTYPE,GTYP_WDEPTH,
GA_TOPBORDER,TRUE,
GA_IMAGE, i, NIL])
obj.button_depth := o
ELSE
RETURN
ENDIF
ELSE
RETURN
ENDIF
ENDIF
->ENDPROC
->PROC DragBar
IF WFLG_DRAGBAR AND win.winflags
IF o := NewObjectA(NIL,'buttongclass',[
GA_TOP,1,
GA_LEFT,1,
GA_WIDTH,10,
GA_HEIGHT, obj.borders.t - 2,
GA_SYSGTYPE,GTYP_WDRAGGING,
GA_TOPBORDER, TRUE, TAG_DONE])
obj.button_dragbar := o
ELSE
RETURN
ENDIF
ENDIF
->ENDPROC
->PROC Size & Zoom
IF WFLG_SIZEGADGET AND win.winflags
IF i := NewObjectA(ic,NIL,[IA_WIDTH,obj.gadw, IA_HEIGHT,obj.gadh, NIL])
obj.image_zoom := i
d := i + ic.instoffset
d.renderer := obj
d.type := FV_GadgetType_Zoom
IF o := NewObjectA(NIL,'buttongclass',[
GA_WIDTH,obj.gadw,
GA_HEIGHT,obj.gadh,
GA_RELVERIFY,TRUE,
GA_SYSGTYPE,GTYP_WZOOM,
GA_TOPBORDER,TRUE,
GA_IMAGE, i, NIL])
obj.button_zoom := o
ELSE
RETURN
ENDIF
ELSE
RETURN
ENDIF
IF o := NewObjectA(NIL,'buttongclass',[
GA_WIDTH,SIZE,
GA_HEIGHT,SIZE,
GA_SYSGTYPE,GTYP_SIZING,
GA_TOPBORDER, TRUE, TAG_DONE])
obj.button_size := o
ELSE
RETURN
ENDIF
ENDIF
->ENDPROC
ENDIF
IF dc := obj.render.context
obj.activepens := F_Get(dc,FA_Display_Scheme)
obj.inactivepens := F_DoA(dc,FM_Display_CreateScheme,[
/*
FA_Pen_Shine,'s:2',->'s:7',
FA_Pen_Fill, 's:4',->'s:7',
FA_Pen_Dark, 's:6',->'s:7',
*/
FA_Pen_Shine,'s:7',
FA_Pen_Fill, 's:7',
FA_Pen_Dark, 's:7',
FA_Pen_Text, 's:3',
NIL])
obj.pens := obj.activepens
F_DoA(win,FM_Window_AddEventHandler,(handler := obj.handler) BUT {handler})
F_DoA(win,FM_Notify,[
FA_Window_Title,FV_Notify_Always,
obj,1,
FM_Renderer_TitleBar])
RETURN TRUE
ENDIF
ENDPROC
PROC wr_Cleanup(obj:PTR TO mydata)
DEF win,a
IF win := obj.render.windowobject
F_DoA(win,FM_Window_RemEventHandler,(a := obj.handler) BUT {a})
F_DoA(win,FM_UnNotifyAttr,[FA_Window_Title])
ENDIF
F_DoA(obj.render.context,FM_DeleteScheme,(a := obj.inactivepens) BUT {a})
obj.render := NIL
obj.pens := NIL
ENDPROC
PROC wr_Show(obj:PTR TO mydata)
DEF win:PTR TO window,o
IF win := obj.render.window
wr_Layout(obj)
IF o := obj.button_close ; AddGadget(win,o,-1) ; win.flags := win.flags OR WFLG_CLOSEGADGET ; ENDIF
IF o := obj.button_zoom ; AddGadget(win,o,-1) ; win.flags := win.flags OR WFLG_HASZOOM ; ENDIF
IF o := obj.button_depth ; AddGadget(win,o,-1) ; win.flags := win.flags OR WFLG_DEPTHGADGET ; ENDIF
IF o := obj.button_size ; AddGadget(win,o,-1) ; win.flags := win.flags OR WFLG_SIZEGADGET ; ENDIF
IF o := obj.button_dragbar THEN AddGadget(win,o,-1)
IF o := obj.button_iconify THEN AddGadget(win,o,-1)
ENDIF
ENDPROC
PROC wr_Hide(obj:PTR TO mydata)
DEF win:PTR TO window
IF win := obj.render.window
RemoveGadget(win,obj.button_iconify)
RemoveGadget(win,obj.button_dragbar)
RemoveGadget(win,obj.button_size)
RemoveGadget(win,obj.button_zoom)
RemoveGadget(win,obj.button_depth)
RemoveGadget(win,obj.button_close)
ENDIF
ENDPROC
PROC wr_HandleEvent(obj:PTR TO mydata,msg:PTR TO intuimessage)
SELECT msg.class
CASE IDCMP_ACTIVEWINDOW ; obj.pens := obj.activepens ; wr_Draw(obj)
CASE IDCMP_INACTIVEWINDOW ; obj.pens := obj.inactivepens ; wr_Draw(obj)
ENDSELECT
ENDPROC
PROC wr_Layout(obj:PTR TO mydata)
DEF win:PTR TO window,x1,y1,x2,y2,o
win := obj.render.window
y1 := 1 ; y2 := win.height - 1
IF (obj.button_close = NIL) AND (obj.button_iconify = NIL)
x1 := 1 + TICKNESS
ELSE
x1 := 1
IF o := obj.button_close
Set(o,GA_LEFT,x1 + TICKNESS, GA_TOP,y1 + TITLEY1, NIL)
x1 := TICKNESS * 2 + x1 + obj.gadw
ENDIF
IF o := obj.button_iconify
Set(o,GA_LEFT,x1 + TICKNESS, GA_TOP,y1 + TITLEY1, NIL)
x1 := TICKNESS * 2 + x1 + obj.gadw
ENDIF
ENDIF
IF (obj.button_zoom = NIL) AND (obj.button_depth = NIL)
x2 := win.width - 1 - TICKNESS
ELSE
x2 := win.width - 1
IF o := obj.button_depth
Set(o,GA_LEFT,x2 - TICKNESS - obj.gadw, GA_TOP,y1 + TITLEY1,NIL)
x2 := x2 - (TICKNESS * 2) - obj.gadw
ENDIF
IF o := obj.button_zoom
Set(o,GA_LEFT,x2 - TICKNESS - obj.gadw, GA_TOP,y1 + TITLEY1,NIL)
x2 := x2 - (TICKNESS * 2) - obj.gadw
ENDIF
ENDIF
IF o := obj.button_dragbar
Set(o,GA_LEFT, x1, GA_WIDTH,x2 - x1 - 1, TAG_DONE)
ENDIF
IF o := obj.button_size
Set(o,GA_LEFT,win.width - SIZE - 1,
GA_TOP,win.height - SIZE - 1, NIL)
ENDIF
ENDPROC
PROC wr_Draw(obj:PTR TO mydata)
DEF win:PTR TO window,o:PTR TO gadget,rp,pn:PTR TO LONG,
x1,y1,x2,y2,ix1,iy1,ix2,iy2,p,
shine,fill,shadow,dark
win := obj.render.window
rp := win.rport
x1 := 0 ; x2 := win.width - 1 ; ix1 := x1 + obj.borders.l - 1 ; ix2 := x2 - obj.borders.r + 1
y1 := 0 ; y2 := win.height - 1 ; iy1 := y1 + obj.borders.t - 1 ; iy2 := y2 - obj.borders.b + 1
pn := obj.pens
shine := pn[FV_Pen_Shine]
fill := pn[FV_Pen_Fill]
shadow := pn[FV_Pen_Shadow]
dark := pn[FV_Pen_Dark]
_APen(dark) ; _Move(x1,y1) ; _Draw(x2,y1) ; _Draw(x2,y2) ; _Draw(x1,y2) ; _Draw(x1,y1)
; _Move(ix1,iy1) ; _Draw(ix2,iy1) ; _Draw(ix2,iy2) ; _Draw(ix1,iy2) ; _Draw(ix1,iy1)
INC x1 ; INC y1 ; DEC x2 ; DEC y2
_APen(fill) ; _Boxf(x1+1,iy1-1,ix1-2,y2-1)
; _Boxf(ix2+2,iy1-1,x2-1,y2-1)
; _Boxf(ix1-1,iy2+2,ix2+1,y2-1)
; _Plot(x1,y2)
; _Plot(ix1-1,iy2+1) ; _Plot(x2,y1)
_APen(shine) ; _Move(x1,iy1) ; _Draw(x1,y2-1)
; _Move(ix1,iy2+1) ; _Draw(ix2+1,iy2+1) ; _Draw(ix2+1,iy1)
_APen(shadow) ; _Move(ix1-1,iy1) ; _Draw(ix1-1,iy2)
; _Move(x1+1,y2) ; _Draw(x2,y2) ; _Draw(x2,iy1)
IF obj.button_size
SaveSP(x1) ; SaveSP(y1)
x1 := x2 - SIZE + 1
y1 := y2 - SIZE + 1
_APen(dark) ; _Move(x1,iy2 + 1) ; _Draw(x1,y2) ; _Move(ix2 + 1,y1) ; _Draw(x2,y1)
_APen(shine) ; _Move(ix2 + 1,y1+1) ; _Draw(x2-1,y1+1) ; _Move(x1+1,y2-1) ; _Draw(x1+1,iy2+1)
_APen(shadow) ; _Move(x1-1,iy2+2) ; _Draw(x1-1,y2-1) ; _Move(ix2+2,y1-1) ; _Draw(x2-1,y1-1)
_APen(fill) ; _Plot(x1-1,iy2+1) ; _Plot(x1+1,y2) ; _Plot(x2,y1+1) ; _Plot(ix2+1,y1-1)
LoadSP(y1) ; LoadSP(x1)
ENDIF
y2 := iy1 - 1
IF (obj.button_close = NIL) AND (obj.button_iconify = NIL)
_APen(shine) ; _Move(x1,y2) ; _Draw(x1,y1) ; _Draw(ix1-2,y1)
_APen(shadow) ; _Move(ix1-1,y2) ; _Draw(ix1-1,y1+1)
_APen(fill) ; _Plot(ix1-1,y1) ; _Boxf(x1+1,y1+1,ix1-2,y2) ; x1 := ix1
ELSE ; p := x1
IF o := obj.button_close
p := priv_ClearAround(rp,p,y1,y2,obj,o,fill,TRUE)
IF obj.button_iconify THEN _APen(fill) BUT _Boxf(p-1,y1,p+1,y2)
ENDIF
IF o := obj.button_iconify THEN p := priv_ClearAround(rp,p,y1,y2,obj,o,fill,TRUE)
_APen(shine) ; _Move(x1,y2) ; _Draw(x1,y1) ; _Draw(p-2,y1)
_APen(shadow) ; _Move(ix1-1,y2) ; _Draw(p-1,y2) ; _Draw(p-1,y1+1)
x1 := p
ENDIF
IF (obj.button_zoom = NIL) AND (obj.button_depth = NIL)
_APen(shine) ; _Move(ix2+1,y2) ; _Draw(ix2+1,y1) ; _Draw(x2-1,y1)
_APen(shadow) ; _Move(x2,y2) ; _Draw(x2,y1+1)
_APen(fill) ; _Plot(x2,y1) ; _Boxf(ix2+2,y1+1,x2-1,y2) ; x2 := ix2
ELSE ; p := x2
_APen(fill) ; _Plot(ix2+1,iy1-1)
IF o := obj.button_depth
p := priv_ClearAround(rp,p,y1,y2,obj,o,fill,FALSE)
IF obj.button_zoom THEN _APen(fill) BUT _Boxf(p-1,y1,p+1,y2)
ENDIF
IF o := obj.button_zoom THEN p := priv_ClearAround(rp,p,y1,y2,obj,o,fill,FALSE)
_APen(shine) ; _Move(p+1,y2-1) ; _Draw(p+1,y1) ; _Draw(x2-1,y1)
_APen(shadow) ; _Move(ix2,y2) ; _Draw(p+2,y2)
; _Move(x2,y2) ; _Draw(x2,y1+1)
x2 := p
ENDIF
_APen(dark) ; _Move(x1,y1) ; _Draw(x1,y2)
; _Move(x2,y1) ; _Draw(x2,y2)
_APen(fill) ; _Plot(x1-1,y1) ; IF (obj.button_depth <> NIL) OR (obj.button_zoom <> NIL) THEN _Plot(x2+1,y2)
obj.barrect.x1 := x1 + 1 ; obj.barrect.y1 := y1
obj.barrect.x2 := x2 - 1 ; obj.barrect.y2 := y2
wr_DrawTitleBar(obj)
ENDPROC
PROC wr_DrawTitleBar(obj:PTR TO mydata)
DEF x1,y1,x2,y2,wt,td:PTR TO feelinTextDisplay,tw,p,rp:PTR TO rastport,
pn:PTR TO LONG,shine,halfshine,fill,halfshadow,shadow,halfdark,
td_Draw:FS_TextDisplay_Draw,rect:feelinRect,
prep
x1 := obj.barrect.x1 ; x2 := obj.barrect.x2 ; wt := F_Get(obj.render.windowobject,FA_Window_Title)
y1 := obj.barrect.y1 ; y2 := obj.barrect.y2 ; td := obj.textdisplay
; rp := obj.render.rport
prep := IF F_Get(obj.render.windowobject,FA_Window_Active) THEN obj.aprep ELSE obj.iprep
IF (x2 < x1) OR (y2 < y1) OR (rp = NIL) THEN RETURN
pn := obj.pens
shine := pn[FV_Pen_Shine]
halfshine := pn[FV_Pen_HalfShine]
fill := pn[FV_Pen_Fill]
halfshadow := pn[FV_Pen_HalfShadow]
shadow := pn[FV_Pen_Shadow]
halfdark := pn[FV_Pen_HalfDark]
obj.render.pens := pn
IF (td <> NIL) AND (wt <> NIL)
F_DoA(td,FM_Set,[
FA_TextDisplay_PreParse, prep,
FA_TextDisplay_Contents, wt,
FA_TextDisplay_Font, obj.font,
NIL])
rect.x1 := x1 + TITLEX1 ; rect.x2 := x2 - TITLEX2
rect.y1 := y1 + TITLEY1 ; rect.y2 := y2 - TITLEY2
F_DoA(td,FM_TextDisplay_Size,{rect})
tw := td.nWidth
_APen(fill) ; _Plot(x1,y2) ; _Boxf(x1+1,y1+1,rect.x1 + tw - 1,y2-1)
_APen(shine) ; _Move(x1,y2-1) ; _Draw(x1,y1) ; _Draw(rect.x1 + tw - 1,y1)
_APen(shadow) ; _Move(x1+1,y2) ; _Draw(rect.x1 + tw - 1,y2)
td_Draw.rect := rect
td_Draw.render := obj.render
F_DoA(td,FM_TextDisplay_Draw,td_Draw)
x1 := rect.x1 + tw
ELSE
_APen(shine) ; _Move(x1,y2-1) ; _Draw(x1,y1) ; _Draw(x1 + TITLEX1 - 1,y1)
_APen(shadow) ; _Move(x1+1,y2) ; _Draw(x1 + TITLEX1 - 1,y2)
_APen(fill) ; _Plot(x1,y2) ; _Boxf(x1+1,y1+1,x1 + TITLEX1 - 1,y2-1)
x1 += TITLEX1
ENDIF
IF y2 - y1 + 1 + 20 + x1 > x2
_APen(fill) ; _Plot(x2,y1) ; _Boxf(x1,y1+1,x2-1,y2-1)
_APen(shine) ; _Move(x1,y1) ; _Draw(x2-1,y1)
_APen(shadow) ; _Move(x1,y2) ; _Draw(x2,y2) ; _Draw(x2,y1+1)
ELSE
INC y1 ; DEC y2 ; DEC x2 ; p := y2 - y1 + 1
_APen(shine) ; _Move(x1,y1-1) ; _Draw(x1 + p,y1-1)
_APen(halfshadow) ; _Plot(x2+1,y1-1)
SaveSP(x2)
x2 := x1 + p - 1 ; _APen(fill)
FOR tw := y1 TO y2
_Move(x1,tw) ; _Draw(x2,tw) ; DEC x2
ENDFOR
LoadSP(x2)
INC x1
x1 := priv_Oblique(rp,x1,y1,y2,1,5,pn)
x1 := priv_Oblique(rp,x1,y1,y2,2,5,pn)
x1 := priv_Oblique(rp,x1,y1,y2,3,5,pn)
x1 := priv_Oblique(rp,x1,y1,y2,4,5,pn)
_APen(halfshine) ; _Move(x1+p,y1 - 1) ; _Draw(x2,y1-1)
_APen(halfdark) ; _Move(x1-1,y2+1) ; _Draw(x2+1,y2+1) ; _Draw(x2+1,y1)
SaveSP(x2)
x2 := x1 + p - 1 ; _APen(halfshadow)
FOR tw := y2 TO y1 STEP -1
_Move(x1,tw) ; _Draw(x2,tw) ; INC x1
ENDFOR
LoadSP(x2)
_Boxf(x1,y1,x2,y2)
ENDIF
ENDPROC
PROC priv_Oblique(rp,x1,y1,y2,n,s,pn:PTR TO LONG)
DEF w,i
w := y2 - y1 + 1
FOR i := 1 TO n
_APen(pn[FV_Pen_HalfShadow]) ; _Move(x1,y2) ; _Draw(x1+w-1,y1)
_APen(pn[FV_Pen_HalfShine]) ; _Plot(x1+w,y1-1)
_APen(pn[FV_Pen_HalfDark]) ; _Plot(x1-1,y2+1)
INC x1
ENDFOR
FOR n := i TO s
_APen(pn[FV_Pen_Fill]) ; _Move(x1,y2) ; _Draw(x1+w-1,y1)
_APen(pn[FV_Pen_Shine]) ; _Plot(x1+w,y1-1)
_APen(pn[FV_Pen_Shadow]) ; _Plot(x1-1,y2+1)
INC x1
ENDFOR
ENDPROC x1
->-- My Image Class --<------------------------------------------------------
PROC image_dispatcher(ic=A0:PTR TO iclass,obj=A2:PTR TO image,msg=A1:PTR TO impdraw)
DEF data:PTR TO myimagedata,rp,
x1,y1,x2,y2,a,b,
pn:PTR TO LONG,p1,p2,p3,shine,halfshine,fill,halfshadow,shadow,halfdark,dark,
f0,f1
sys_RGlob() ; data := obj + ic.instoffset
IF msg.methodid = IM_DRAW
rp := msg.rport
pn := data.renderer.activepens
x1 := msg.offsetx + obj.leftedge ; x2 := x1 + obj.width - 1
y1 := msg.offsety + obj.topedge ; y2 := y1 + obj.height - 1
p1 := data.renderer.pens[FV_Pen_HalfShine]
p2 := data.renderer.pens[FV_Pen_HalfShadow]
p3 := data.renderer.pens[FV_Pen_Fill]
shine := pn[FV_Pen_Shine]
halfshine := pn[FV_Pen_HalfShine]
fill := pn[FV_Pen_Fill]
halfshadow := pn[FV_Pen_HalfShadow]
shadow := pn[FV_Pen_Shadow]
halfdark := pn[FV_Pen_HalfDark]
dark := pn[FV_Pen_Dark]
f0 := `priv_Bevel(rp,x1,y1,x2,y2,p2,p1,p3)
f1 := `priv_Glow(rp,x1+1,y1+1,x2-1,y2-1,pn)
SELECT data.type
CASE FV_GadgetType_Close
IF msg.state == [IDS_NORMAL,IDS_INACTIVENORMAL]
Eval(f0) ; priv_Shape(rp,x1+1,y1+1,x2-1,y2-1,pn)
ELSEIF msg.state = IDS_SELECTED
Eval(f0) ; Eval(f1)
ENDIF
CASE FV_GadgetType_Iconify
_APen(3)
_Boxf(x1,y1,x2,y2)
CASE FV_GadgetType_Zoom
IF msg.state == [IDS_NORMAL,IDS_INACTIVENORMAL]
Eval(f0) ; priv_Shape(rp,x1+1,y1+1,x2-1,y2-1,pn)
INC x1 ; INC y1 ; DEC x2 ; DEC y2
a := x2 - x1 + 1 / 2
b := y2 - y1 + 1 / 2
priv_Shape(rp,x1,y1,x1+a+1,y1+b+1,pn)
ELSEIF msg.state = IDS_SELECTED
Eval(f0) ; Eval(f1)
ENDIF
CASE FV_GadgetType_Depth
IF msg.state == [IDS_NORMAL,IDS_INACTIVENORMAL]
_APen(p3) ; _Boxf(x1,y1,x2,y2)
INC x1 ; INC y1 ; DEC x2 ; DEC y2
a := x2 - x1 + 1 / 2
b := y2 - y1 + 1 / 2
priv_Bevel(rp,x1-1,y1-1,x1+a+3,y1+b+3,p2,p1,p3)
priv_Bevel(rp,x2-a-3,y2-b-3,x2+1,y2+1,p2,p1,p3)
priv_Shape(rp,x2-a-2,y2-b-2,x2,y2,pn)
priv_Shape(rp,x1,y1,x1+a+2,y1+b+2,pn)
ELSEIF msg.state = IDS_SELECTED
_APen(fill) ; _Boxf(x1,y1,x2,y2)
INC x1 ; INC y1 ; DEC x2 ; DEC y2
a := x2 - x1 + 1 / 2
b := y2 - y1 + 1 / 2
priv_Bevel(rp,x1-1,y1-1,x1+a+3,y1+b+3,halfshadow,halfshine,fill)
priv_Bevel(rp,x2-a-3,y2-b-3,x2+1,y2+1,halfshadow,halfshine,fill)
priv_Glow(rp,x1,y1,x1+a+2,y1+b+2,pn)
priv_Glow(rp,x2-a-2,y2-b-2,x2,y2,pn)
ENDIF
ENDSELECT
ELSE
RETURN DoSuperMethodA(ic,obj,msg)
ENDIF
ENDPROC
->-- Private --<-------------------------------------------------------------
PROC priv_Bevel(rp,x1,y1,x2,y2,p1,p2,p3)
_APen(p1) ; _Move(x1,y2-1) ; _Draw(x1,y1) ; _Draw(x2-1,y1)
_APen(p2) ; _Move(x1+1,y2) ; _Draw(x2,y2) ; _Draw(x2,y1+1)
_APen(p3) ; _Plot(x1,y2) ; _Plot(x2,y1)
ENDPROC
PROC priv_Box(rp,x1,y1,x2,y2)
_Move(x1,y2) ; _Draw(x1,y1) ; _Draw(x2,y1) ; _Draw(x2,y2) ; _Draw(x1,y2)
ENDPROC
PROC priv_Shape(rp,x1,y1,x2,y2,pn:PTR TO LONG)
DEF halfshine,halfshadow,fill
IF (x1 > x2) AND (y1 > y2) THEN RETURN
halfshine := pn[FV_Pen_HalfShine]
halfshadow := pn[FV_Pen_HalfShadow]
fill := pn[FV_Pen_Fill]
_APen(pn[FV_Pen_HalfDark])
_Box(x1,y1,x2,y2)
_APen(fill)
IF (x1+2 <= x2-2) AND (y1+2 <= y2-2) THEN _Boxf(x1+2,y1+2,x2-2,y2-2)
priv_Bevel(rp,x1+1,y1+1,x2-1,y2-1,halfshine,halfshadow,fill)
ENDPROC
PROC priv_Glow(rp,x1,y1,x2,y2,pn:PTR TO LONG)
IF (x1 > x2) AND (y1 > y2) THEN RETURN
_APen(pn[FV_Pen_HalfDark]) ; _Box(x1,y1,x2,y2)
INC x1 ; INC y1 ; DEC x2 ; DEC y2
_APen(pn[FV_Pen_HalfShadow]) ; _Boxf(x1,y1,x2,y2)
_APen(pn[FV_Pen_Shine]) ; _Plot(x1,y1)
; _Move(x2-2,y2) ; _Draw(x2,y2) ; _Draw(x2,y2-2)
_APen(pn[FV_Pen_Shadow]) ; _Move(x1,y2-1) ; _Draw(x1,y1+2) ; _Draw(x1+2,y1) ; _Draw(x2-1,y1)
; _Plot(x1+1,y1+2) ; _Plot(x1+2,y1+1)
_APen(pn[FV_Pen_HalfShine]) ; _Move(x1+1,y2) ; _Draw(x2-3,y2) ; _Draw(x2,y2-3) ; _Draw(x2,y1+1) ; _Plot(x2-1,y2-1)
ENDPROC
PROC priv_ClearAround(rp,x,y1,y2,obj:PTR TO mydata,g:PTR TO gadget,fill,forward)
DEF x1,x2,w,i
w := TICKNESS * 2 + obj.gadw
IF forward
x1 := x ; x2 := x + w - 1
ELSE
x1 := x - w + 1 ; x2 := x
ENDIF
_APen(fill)
_Boxf(x1+1,y1+1,x2-1,y2-1)
IF i := g.gadgetrender THEN DrawImageState(rp,i,x1 + TICKNESS, y1 + TITLEY1, IDS_NORMAL,NIL)
RETURN IF forward THEN x2 + 1 ELSE x1 - 1
ENDPROC
/*
->PROC Iconify
IF i := NewObjectA(ic,NIL,[IA_WIDTH,obj.gadw, IA_HEIGHT,obj.gadh, NIL])
obj.image_iconify := i
d := i + ic.instoffset
d.renderer := obj
d.type := FV_GadgetType_Iconify
IF o := NewObjectA(NIL,'buttongclass',[
GA_WIDTH,obj.gadw,
GA_HEIGHT,obj.gadh,
GA_RELVERIFY,TRUE,
GA_SYSGTYPE,GTYP_CLOSE,
GA_TOPBORDER,TRUE,
GA_IMAGE, i, NIL])
obj.button_iconify := o
ELSE
RETURN
ENDIF
ELSE
RETURN
ENDIF
->ENDPROC
*/